package cn.lkk.samples.lang.fundamental;

/**
 * 演示变量的基本使用。包括变量名、变量初始化、常量的使用。
 */
public class Vairables {

    public static String ID_CHAR_CHECK_FORMAT = "%1$c is %2$s identifier %3$s";

    public static void main(String[] main) {
        vairableNames();
        init();
        constantValue();
    }

    /**
     * 演示使用变量名
     */
    public static void vairableNames() {
        //1. 变量名，以字母开头，后面可以跟任意多的字母
        String varName;
        // 以数字开头的字母是不符合要求的
        //String 2vairable

        //2. 检测字符是否为变量名的有效部分首字母
        checkValidIdentifierStart('1');
        checkValidIdentifierStart('a');
        checkValidIdentifierStart('\u03c0');
        checkValidIdentifierStart('\u2122');

        //3. 检测字符是否为变量名的有效部分首字母
        checkValidIdentifierPart('1');
        checkValidIdentifierPart('a');
        checkValidIdentifierPart('\u03c0');
        checkValidIdentifierPart('\u2122');
    }

    /**
     * 演示初始化
     */
    public static void init() {
        String initAtOnce = "变量可以在定义时就初始化";

        String initLater;
        initLater = "此时赋值也是初始化";
    }

    /**
     * 演示常量使用
     */
    public static void constantValue() {
        // 常量只能赋值一次，赋值之后就不能再次修改。常量通常全是大写的。
        final String A_CONST = "value";

        // 给常量赋值是会报错的
        //A_CONST="new value";

        // 和变量一样，常量也是可以稍后初始化的
        final String B_CONST;
        B_CONST = "value";
    }

    public static void checkValidIdentifierStart(char c) {
        checkValidIdentifierChar(c, true);
    }

    public static void checkValidIdentifierPart(char c) {
        checkValidIdentifierChar(c, false);
    }

    public static void checkValidIdentifierChar(char c, boolean isStart) {
        boolean result;
        String detectPart;
        if (isStart) {
            result = Character.isJavaIdentifierStart(c);
            detectPart = "start";
        } else {
            result = Character.isJavaIdentifierPart(c);
            detectPart = "part";
        }
        System.out.println(String.format(ID_CHAR_CHECK_FORMAT, c, result ? "valid" : "invalid", detectPart));
    }
}
